#ifndef xpack_macro_xcstyle
#define xpack_macro_xcstyle

/*
作用：
可以将 C++ 无参数捕获的 lambda 表达式转换成 C 接口兼容的回调函数

用法：
#include"macro/xcstyle.hpp"

void bar( void(* foo)(int) ){
    foo(10);
}

void test(){
    bar(xcstyle(int value) -> void {
        //                 ^^^^^^^ 指定返回值类型
        // do sth...
    });
}

*/

namespace mixc::macro_xcstyle{
    template<class> struct meta;

    template<class ret_t, class lambda_t, class ... args_t>
    struct meta<ret_t(lambda_t::*)(args_t...) const>{
        static ret_t cstyle(args_t ... list){
            return lambda_t()(list...);
        }
    };

    struct sugar{
        template<class lambda_t>
        constexpr auto operator * (lambda_t const &){
            auto func = & lambda_t::operator();
            return meta<decltype(func)>::cstyle;
        }
    };
}

#define xcstyle     ::mixc::macro_xcstyle::sugar() * []
#endif
